
# 两组数据假设检验柱形图
# 包含柱形图、误差线、比较线、统计量
# 坐标、图标、字体、线段粗细、比较函数，比较线位置，统计量显示，图像大小等均可调整

source('db_base.R')

# tableName = 'dataset_of_1_30' # 表名
# columnX = 'suppp'  # 观察变量
# columnY = 'leng'  # 组变量
# y_position = 5   # 大括号位置
# palette_type = "jco"  # 杂志风格
# zhu_width = 0.3  # 柱子宽度
# tu_width = 8       # 图像尺寸 宽度
# tu_height = 8     # 图像尺寸 高度
# fill_color = 0  # 填充颜色 0 无填充，1 同柱子颜色

bartwobj=function(tableName, columnX, columnY, y_position, palette_type, zhu_width, tu_width, tu_height, fill_color){
  
  # 本程序共分为5个部分，第1部分和第5部分代码不能修改，其他3部分可以根据需要修改
  # 本程序以"牙齿生长"为例子，用户选择自己的数据，数据会自动加载到datax变量中。
  # x轴和y轴变量根据变量名字修改，具体修改位置看注释
  # 作图的数据值会直接显示在页面结果页
  
  
  #  一、环境数据配置
  
  #此部分代码不能修改
  #加载各个数据包
  library("ggplot2")
  library("ggpubr")
  library("base64enc")
  library("grDevices")
  library("Cairo")
  
  #获取数据，本行不能有任何改动
  datax=linkdata(tableName)  
  
  #  二、计算统计量
  
  # compare_means为比较函数，建立对象bijiao，并通过stat_pvalue_manual实现作图
  # 通过公式实现比较，~前面为观察变量，后面为组变量t.test。
  # 本例中len表示长度是数值型，supp表示用药类型为字符变量（因子）
  # 在两组比较时候，method可选择t.test和wilcox.test（非参数检验）。
  
  
  # 大括号的位置，建议初始为观察值最大值，之后调整
  if(y_position == 0) {
    y_position = max(datax[,columnY])*0.88
  }
  fill_default = "NA"
  if(fill_color == 1) {
    fill_default = columnX
  }
  
  cformula = paste(columnY, columnX, sep="~")
  bijiao=compare_means(as.formula(cformula),datax,method = "t.test", FALSE)
  
  #  三、ggbarplot作条形图
  
  # 所有作图函数都以+统一叠加到tu对象上  
  
  # palette可以自己设计颜色，也可以选用风格，主要杂志风格如下
  # npg(nature风格) 、aaas(science风格)、 lancet(柳叶刀风格) 、jco（Clinical Oncology）
  # uchicago（University of Chicago）、rickandmorty（ Rick and Morty）
  # nejm（New England Journal of Medicine）、jama（the American Medical Association）
  # ucscgb（UCSC 数据库）、LocusZoom、 IGV、simpsons、D3
  
  # 自己设置颜色参考代码palette = c("#00AFBB", "#E7B800")
  
  tu=ggbarplot(
    datax,             #数据
    x = columnX,        #设置x轴
    y = columnY,         #设置y轴
    width = zhu_width,       #柱子宽度
    color = columnX,    #柱子颜色划分
    fill  = fill_default,    #填充颜色，和可柱子颜色设置相同，若空心柱子设置为NA
    palette = palette_type,   #杂志风格
    add="mean_sd",      #添加误差线"mean_se"标准误或"mean_sd"标准差
    add.params=list(color="black",size=0.15)  #添加误差线颜色和粗细
  )+                 #最后一个变量不用，函数结尾要有+。
    
    
  
  #  四、添加比较线
  
  #注意：大括号的位置需要自己设置，首次设置可能位置不准确，图像变形，需要手工调整。
  
  stat_pvalue_manual(
    bijiao,                          #较比对象名字
    label="p.signif",                #统计量是数值"p"或符号"p.signif",可以设置格式为："Test,p={round(p, 3)}"保留3小数
    y.position = y_position,         #此值必须设置，大括号的位置，建议初始为观察值最大值，之后调整。
    size = 3,                        #统计量字体大小
    bracket.size=0.1,                #大括号粗细
    vjust=-0.2                       #统计量到大括号的距离
  )+                            #最后一个变量不用，函数结尾要有+
  
  #  四、调整图形参数
  
  #设置坐标
  #scale_y_continuous( breaks=seq(0,30,7))+          #调整y轴刻度，0到30，间隔为7（有的期刊要求y轴为5个点坐标，根据数据自行调整）
  theme(axis.line = element_line(size = 0.2))+      #调整坐标粗细
  font("x.text",size = 6)+                   #设置x轴文本
  font("y.text",size = 6)+                   #设置y轴文本
  font("xlab", size = 9)+                    #设置x轴标题
  font("ylab", size = 9)+                    #设置y轴标题
  
  #设置图标
  theme(
    legend.key.size = unit(0.25,"cm"),              #图标大小
    legend.margin=margin(0.05, 0, 0, 4, "cm"),      #图标边距（四个数字分别调整上,右，下，左的边距）
    legend.direction="horizontal",                  #图标方向，"horizontal" or "vertical"
    legend.position="top")+                         #图标位置， "left", "right", "bottom", "top",或者2个坐标值
  
  font("legend.title",size = 8)+             #设置图标标题大小
  font("legend.text",size = 5)               #设置图标文本大小


  #五、保存图像文件
  
  #此行不能改动，生成随机文件名字 
  set.seed(Sys.time())
  p=paste0(runif(1, min=0, max=1)*1000000000000000,".tiff")    
  
  #期刊文件格式为eps、jpg、tiff。eps为矢量图，一般我们使用tiff格式。像素要求1000dpi，大小在10MB以内所以要压缩。
  #期刊尺寸分为单栏（8.3cm） 、2/3栏（11.7cm）、全栏（17.6cm），高度随意。
  
  tiff(
    filename = p,             #文件名字
    width = tu_width,         #宽度
    height = tu_height,       #高度
    units = "cm",             #单位，设置为cm
    compression = c("lzw"),   #压缩算法，此行最好不要修改，lzw符合大多数杂志要求
    bg = "white",             #背景颜色
    type = "cairo",
    res = 1000,               #分辨率为1000
  )              #注意最后的括号
  
  print(tu)                      #打印ggpubr对象
  
  dev.off()                      #关闭文件
  
  # 六、设置函数返回值
  
  #以下不能有任何改变
  
  q=base64encode(p)        #图片转成base64，此行不能有任何改变
  file.remove(p)           #清除文件，此行不能有任何改变
  return(q)                #返回值，此行不能有任何改变
  
}                          #注意最后的括号

# bartwobj(tableName, columnX, columnY, NULL, palette_type, zhu_width, tu_width, tu_height, fill_color)
